﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Windows.Forms;

namespace GestionBudget.Objects
{
    public class SousCategorieProfil : ObjectPersistent
    {
        private const string NOM_FICHIER_XML = "souscategoriesprofils.xml";
        private const string RACINE_XML = "SousCategoriesProfils";

        private int identifiant;
        private SousCategorie sousCategorie;
        private Profil profil;

        private SousCategorieProfil()
        {
            SetEstNouveauTrue();
        }

        private SousCategorieProfil(SousCategorie sousCategorie)
        {
            SetEstNouveauTrue();

            identifiant = Convert.ToInt32(string.Format("{0}{1}", sousCategorie.Identifiant.ToString(), profil.Identifiant.ToString()));
            profil = Securite.ProfilCourant;
            this.sousCategorie = sousCategorie;
        }

        private SousCategorieProfil(string identifiantSCP, string identifiantSousCategorie, string identifiantProfil)
        {
            identifiant = Convert.ToInt32(identifiantSCP);
            profil = DictionnaireDonnees.ListeProfils.First(pr => pr.Identifiant.ToString().Equals(identifiantProfil));
            sousCategorie = DictionnaireDonnees.ListeSousCategories.First(sc => sc.Identifiant.ToString().Equals(identifiantSousCategorie));
        }

        public int Identifiant
        {
            get
            {
                return identifiant;
            }
        }

        public SousCategorie SousCategorie
        {
            get { return sousCategorie; }
            set { sousCategorie = value; }
        }

        public Profil Profil
        {
            get { return profil; }
            set { profil = value; }
        }

        public static SousCategorieProfil Creer()//Todo SousCategorie sousCategorie)
        {
            SousCategorieProfil nouvelleSousCatProfil = new SousCategorieProfil(); //Todo sousCategorie);
            DictionnaireDonnees.ListeSousCategorieProfil.Add(nouvelleSousCatProfil);

            return nouvelleSousCatProfil;
        }

        public override void AttribuerIdentifiant()
        {
            identifiant = Convert.ToInt32(string.Format("{0}{1}", sousCategorie.Identifiant.ToString(), profil.Identifiant.ToString()));
        }

        static public List<SousCategorieProfil> ChargerListe(int identifiantProfil)
        {

            CreerFichier(NOM_FICHIER_XML, RACINE_XML);

            try
            {
                List<SousCategorieProfil> ListeSCP = new List<SousCategorieProfil>();
                XElement xelement = XElement.Load(NOM_FICHIER_XML);

                IEnumerable<XElement> transactions = xelement.Elements();

                foreach (var sousCategorieProfil in (from trans in transactions
                                             where trans.Element("identifiantProfil").Value.Equals(identifiantProfil.ToString())
                                             select trans))
                {
                    SousCategorieProfil nouvelleSCP = new SousCategorieProfil(sousCategorieProfil.Element("identifiant").Value,
                                                                              sousCategorieProfil.Element("identifiantSousCategorie").Value,
                                                                              sousCategorieProfil.Element("identifiantProfil").Value);
                    ListeSCP.Add(nouvelleSCP);
                }

                return ListeSCP;
            }
            catch (Exception e)
            {
                MessageBox.Show("Une erreur est survenue lors du chargement des sous-categories du profil; " + e.Message);
                return null;
            }
        }

        public override void Sauvegarder()
        {
            CreerFichier(NOM_FICHIER_XML, RACINE_XML);

            try
            {
                if (this.EstModifie || this.EstNouveau)
                {
                    XDocument xDocument = XDocument.Load(NOM_FICHIER_XML);

                    if (this.EstNouveau)
                    {
                        if (this.Identifiant == 0)
                        {
                            AttribuerIdentifiant();
                        }

                        xDocument.Root.Add(new XElement("SousCategorieProfil", new XElement("identifiant", this.identifiant.ToString()),
                                                                        new XElement("identifiantSousCategorie", "0"/*Todo this.sousCategorie.Identifiant.ToString()*/),
                                                                        new XElement("identifiantProfil", "0"/*this.profil.Identifiant.ToString()*/)));
                    }
                    else if (this.EstModifie)
                    {
                        AttribuerIdentifiant();

                        IEnumerable<XElement> sousCategoriesProfils = xDocument.Elements();
                        XElement elementSCP = (from scp in sousCategoriesProfils.Elements()
                                               where scp.Element("identifiant").Value.Equals(this.identifiant.ToString())
                                               select scp).First();
                        elementSCP.Element("identifiantSousCategorie").Value = "0"/*Todo this.SousCategorie.Identifiant.ToString()*/;
                        elementSCP.Element("identifiantProfil").Value = "0"/*Todo this.Profil.Identifiant.ToString()*/;
                    }

                    xDocument.Save(NOM_FICHIER_XML);

                    base.Sauvegarder();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Une erreur est survenue lors de la sauvegarde d'une sous-catégorie du profil; " + e.Message);
            }
        }

        public override void Supprimer()
        {
            if (!this.EstNouveau)
            {
                try
                {
                    XDocument xDocument = XDocument.Load(NOM_FICHIER_XML);
                    IEnumerable<XElement> sousCategoriesProfils = xDocument.Elements();
                    XElement elementSCP = (from scp in sousCategoriesProfils.Elements()
                                           where scp.Element("identifiant").Value.Equals(this.Identifiant.ToString())
                                           select scp).First();
                    elementSCP.Remove();
                    xDocument.Save(NOM_FICHIER_XML);
                }
                catch (Exception e)
                {
                    MessageBox.Show("Une erreur est survenue lors de la suppression de la sous-catégorie du profil; " + e.Message);
                }
            }
            this.Dispose();
        }
    }
}
